package com.mukefile.service.aop;

import com.mukefile.dao.MLogDao;
import com.mukefile.dao.UserDao;
import com.mukefile.pojo.MLog;
import com.mukefile.pojo.Manager;
import com.mukefile.pojo.ShareFile;
import com.mukefile.pojo.User;
import com.opensymphony.xwork2.ActionContext;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.Date;
import java.util.Map;
import java.util.Objects;

/**
 * @Author: kenewstar
 * @Description: 管理员日志切面
 * @Date:Created in 2020/9/15
 */
@Component
@Aspect
public class MLogAop {

    @Autowired
    private MLogDao mLogDao;

    @Autowired
    private UserDao userDao;

    /**
     * 管理员登录日志
     * @param manager 获取返回的管理员对象
     */
    @AfterReturning(value = "execution(* com.mukefile.service.impl.ManagerServiceImpl.managerLogin(..))",
                returning = "manager")
    public void managerLoginLog(Manager manager){
        if (Objects.isNull(manager)) return;
        // 创建日志对象
        MLog mLog = new MLog();
        // 填充日志对象
        mLog.setLogContent("管理员："+manager.getName()+" 登录了系统!");
        mLog.setLogTime(new Date());
        mLog.setMid(manager.getId());
        // 执行插入操作
        this.mLogDao.insertMLog(mLog);
    }

    /**
     * 用户退出日志
     * @param session
     */
    @Before(value = "execution(* com.mukefile.service.impl.ManagerServiceImpl.managerExit(..))&&args(session)")
    public void managerExitLog(Map<String,Object> session){
        Manager manager = (Manager) session.get("manager");
        if (Objects.isNull(manager)) return;
        // 创建日志对象
        MLog mLog = new MLog();
        // 填充日志对象
        mLog.setLogContent("管理员："+manager.getName()+" 退出了系统!");
        mLog.setLogTime(new Date());
        mLog.setMid(manager.getId());
        // 执行插入方法
        this.mLogDao.insertMLog(mLog);

    }

    /**
     * 管理员添加用户操作的日志
     * @param user 用户
     * @param result 返回结果
     */
    @AfterReturning(value = "execution(int com.mukefile.service.impl.ManagerServiceImpl.addUser(..))" +
            "&&args(user,manager)",returning = "result", argNames = "user,manager,result")
    public void addUserLog(User user,Manager manager,int result){
        if (Objects.isNull(user)) return;
        // 创建日志对象
        MLog mLog = new MLog();

        if (Objects.isNull(manager)) return;
        // 填充日志对象
        if (result > 0){
            mLog.setLogContent("管理员："+manager.getName()+" 添加用户《"+user.getUsername()+"》成功!");
        }else {
            mLog.setLogContent("管理员："+manager.getName()+" 添加用户《"+user.getUsername()+"》失败!");
        }
        mLog.setLogTime(new Date());
        mLog.setMid(manager.getId());
        // 执行插入
        this.mLogDao.insertMLog(mLog);
    }

    /**
     * 管理员给用户扩容操作的日志
     * @param uid 用户id
     * @param size 扩容大小
     * @param manager 管理员
     * @param result 返回操作结果
     */
    @AfterReturning(value = "execution(* com.mukefile.service.impl.ManagerServiceImpl.expandDisk(..))" +
            "&&args(uid,size,manager)" ,returning = "result", argNames = "uid,size,manager,result")
    public void expandDiskLog(Integer uid,Integer size,Manager manager,int result){
        if (Objects.isNull(manager)) return;
        // 根据uid查询用户名
        User user = this.userDao.selectUserById(uid);
        if (Objects.isNull(user)) return;
        // 创建日志对象
        MLog mLog = new MLog();
        if (result > 0){
            mLog.setLogContent("管理员："+manager.getName()+" 给用户《"+user.getUsername()+"》" +
                    "的磁盘扩容 "+size+"MB !");
        }else {
            mLog.setLogContent("管理员："+manager.getName()+" 给用户《"+user.getUsername()+"》" +
                    "的磁盘扩容失败!");
        }
        mLog.setLogTime(new Date());
        mLog.setMid(manager.getId());
        // 执行插入
        mLogDao.insertMLog(mLog);
    }

    /**
     * 管理员给用户重置密码操作日志
     * @param uid 用户id
     * @param manager 管理员
     * @param result 返回结果
     */
    @AfterReturning(value = "execution(* com.mukefile.service.impl.ManagerServiceImpl.resetPwd(..))" +
            "&&args(uid,manager)" ,returning = "result", argNames = "uid,manager,result")
    public void resetPwdLog(Integer uid,Manager manager,int result){
        if (Objects.isNull(manager)) return;
        // 获取用户
        User user = this.userDao.selectUserById(uid);
        if (Objects.isNull(user)) return;
        // 创建日志对象
        MLog mLog = new MLog();
        if (result > 0){
            mLog.setLogContent("管理员："+manager.getName()+" 给用户《"+user.getUsername()+"》"+
                    "重置密码成功!");
        }else {
            mLog.setLogContent("管理员："+manager.getName()+" 给用户《"+user.getUsername()+"》"+
                    "重置密码失败!");
        }
        mLog.setLogTime(new Date());
        mLog.setMid(manager.getId());
        // 执行插入
        this.mLogDao.insertMLog(mLog);
    }

    /**
     * ***************************
     * 共享文件的操作日志
     * ***************************
     */
    /**
     * 管理员上传文件
     * @param shareFile 共享文件
     * @param file 文件流
     * @param manager 管理员
     * @param result 返回结果
     */
    @AfterReturning(value = "execution(* com.mukefile.service.impl.ShareFileServiceImpl.fileUpload(..))" +
            "&&args(shareFile,file,manager)",returning = "result", argNames = "shareFile,file,manager,result")
    public void fileUploadLog(ShareFile shareFile, File file,Manager manager,int result){
        if (Objects.isNull(shareFile)) return;
        if (Objects.isNull(manager)) return;
        // 创建日志对象
        MLog mLog = new MLog();
        if (result > 0){
            mLog.setLogContent("管理员："+manager.getName()+" 上传文件《"+shareFile.getFileName()+
                    "》成功!");
        }else {
            mLog.setLogContent("管理员："+manager.getName()+" 上传文件《"+shareFile.getFileName()+
                    "》失败!");
        }
        mLog.setLogTime(new Date());
        mLog.setMid(manager.getId());
        // 执行插入
        this.mLogDao.insertMLog(mLog);

    }

    /**
     * 用户删除文件
     * @param fid 文件id
     * @param fileName 文件名
     * @param manager 管理员
     * @param result 返回结果
     */
    @AfterReturning(value = "execution(* com.mukefile.service.impl.ShareFileServiceImpl.deleteFile(..))" +
            "&&args(fid,fileName,manager)" ,returning = "result", argNames = "fid,fileName,manager,result")
    public void deleteFileLog(Integer fid, String fileName, Manager manager,int result){
        if (Objects.isNull(manager)) return;
        // 创建日志对象
        MLog mLog = new MLog();
        if (result > 0){
            mLog.setLogContent("管理员："+manager.getName()+" 删除文件《"+fileName+"》成功!");
        }else {
            mLog.setLogContent("管理员："+manager.getName()+" 删除文件《"+fileName+"》失败!");
        }
        mLog.setLogTime(new Date());
        mLog.setMid(manager.getId());
        // 执行插入
        this.mLogDao.insertMLog(mLog);
    }


}
